<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        console.log(num); //undefined
        var num = 10;
        // run(); //报错 run不是一个函数
        console.log(run); //undefined
        var run = function(){
            console.log("run");
        }
        run1();
        function run1(){
            console.log("===");
        }

        // var 可以重复声明(不推荐)
        // 有声明提升
        // 以函数区分作用域
        var num = 20;
        console.log(num);
        function run2(){ 
            console.log(num); //undefined
            var num = 30;
            console.log(num); //30

            var n = 100;  //局部变量
        }
        run2();
        // console.log(n); //报错 外部作用域不可以使用内部作用域的变量

        // let没有声明提升
        // let的作用域是以{}区分的 块级作用域
        // let不可以重复声明
        // console.log(str); 报错
        let str = "111";
        if(true){
            let str1 = "222";
            console.log(str1);
        }
        // console.log(str1); //报错

        // let str = "333"; //报错

        
        if(true){
          var num3 = 40;  
        }
        console.log(num3); //40


        // 同步: 代码从上往下一步一步执行,上面代码没有执行完,下边代码不会执行
        // 异步: 代码从上往下,可以让一下需要等待时间的代码同时执行,不影响下边代码的执行


        // index是全局变量
        // 循环先执行; 操作的是唯一的一个index值的更改
        // 在循环执行完后,再次使用index 得到的是更改后的index的值
        
        for (var index = 0; index < 10; index++) {
            // console.log(index);
            // 异步执行
            setTimeout(function(){
                // 76行执行之后才会执行的 
                console.log(index);//  10
            },4) 
            
           
        }
        console.log("---");
        console.log(index); //10

        // b是 块级变量
        // 会先执行循环, 但是每个循环都是一个单独的作用域(对于let来说)
        // 那么在每个循环体中都会有一个块级变量b的值等于当前b的值
        // 每个作用域都是独立的
        // 在循环内后来使用b时,得到的都是当前作用域记录的b的值
        for (let b = 2; b < 10;b++ ) {
            
            // 异步执行
            setTimeout(function(){
                console.log(b); // 0--9
            },4)

            
        }
        console.log("====",b); //报错


    </script>
</body>
</html>